<?php

namespace app\admin\controller\life;

use app\common\controller\Backend;
use fast\Tree;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use think\Exception;

/**
 * 生活方式调查
 *
 * @icon fa fa-circle-o
 */
class ProjectLife extends Backend
{

    /**
     * ProjectLife模型对象
     * @var \app\admin\model\life\ProjectLife
     */
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\life\ProjectLife;
	    
	    // 必须将结果集转换为数组
	    $classList = $this->model->order('id ASC')->select();
	    Tree::instance()->init($classList,'pid');
	    $this->classlist = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0));
	    
	    $classdata = [0 => __('None')];
	    foreach ($this->classlist as $k => &$v) {
		    $classdata[$v['id']] = $v['name'];
	    }
	    $this->classdata = $classdata;
	    $this->view->assign('classdata', $classdata);

    }



    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */
	
	public function index()
	{
		if ($this->request->isAjax()) {
			$list = $this->classlist;
			$total = count($list);
			$result = array("total" => $total, "rows" => $list);
			
			return json($result);
		}
		return $this->view->fetch();
	}
	
	public function import()
	{
		$file = $this->request->request('file');
		if (!$file) {
			$this->error(__('Parameter %s can not be empty', 'file'));
		}
		$filePath = ROOT_PATH . DS . 'public' . DS . $file;
		if (!is_file($filePath)) {
			$this->error(__('No results were found'));
		}
		//实例化reader
		$ext = pathinfo($filePath, PATHINFO_EXTENSION);
		if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
			$this->error(__('Unknown data format'));
		}
		if ($ext === 'csv') {
			$file = fopen($filePath, 'r');
			$filePath = tempnam(sys_get_temp_dir(), 'import_csv');
			$fp = fopen($filePath, 'w');
			$n = 0;
			while ($line = fgets($file)) {
				$line = rtrim($line, "\n\r\0");
				$encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
				if ($encoding !== 'utf-8') {
					$line = mb_convert_encoding($line, 'utf-8', $encoding);
				}
				if ($n == 0 || preg_match('/^".*"$/', $line)) {
					fwrite($fp, $line . "\n");
				} else {
					fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
				}
				$n++;
			}
			fclose($file) || fclose($fp);
			
			$reader = new Csv();
		} elseif ($ext === 'xls') {
			$reader = new Xls();
		} else {
			$reader = new Xlsx();
		}
		
		try {
			if (!$PHPExcel = $reader->load($filePath)) {
				$this->error(__('Unknown data format'));
			}
			$currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
			$allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 F
			
			$allRow = $currentSheet->getHighestRow(); //取得一共有多少行 6
			$maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
			$fields = [];
			$rows = [];
			for ($i = 2;$i <= $allRow;$i++){
				$val = $currentSheet->getCellByColumnAndRow(1, $i)->getValue();
				if ($val){
					$fields[] = $val;
				}
				$values = [];
				for ($currentColumn = 2; $currentColumn <= $maxColumnNumber; $currentColumn++) {
					$val = $currentSheet->getCellByColumnAndRow($currentColumn, $i)->getValue();
					if (!empty($val)){
						$values[] = $val;
					}
				}
				$rows[]=$values;
			}
			foreach ($fields as $key => $field){
				$data = [];
				$ret = \app\admin\model\life\ProjectLife::create(['name'=>$field]);
				foreach ($rows[$key] as $row){
					$data[] = ['name'=>$row];
				}
				$ret->children()->saveAll($data);
			}
		} catch (Exception $exception) {
			$this->error($exception->getMessage());
		}
		$this->success();
	}
	
	
	
}
